package com.bugstack.springframework.beans.factory.support;

import com.bugstack.springframework.beans.factory.BeanFactory;
import com.bugstack.springframework.beans.factory.config.BeanDefinition;


//而 AbstractBeanFactory 又继承了实现了 SingletonBeanRegistry 的DefaultSingletonBeanRegistry 类。这样 AbstractBeanFactory 抽象类就具备了单例 Bean 的注册功能。
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {




    /**
     * 下面这两个方法主要是在获取不到时需要拿到 Bean 的定义做相应 Bean 实例化操作
     * @param beanName
     * @return
     */
    protected abstract BeanDefinition getBeanDefinition(String beanName);

    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);


    /**
     * 那么 getBean 并没有自身的去实现这些方法，而是只定义了调用过程以及提供了抽象方法，由实现此抽象类的其他类做相应实现。
     * @param name
     * @return
     */
    @Override
    public Object getBean(String name) {
        Object bean =getSingLeton(name);//首先对单例对象进行获取
        if (bean != null) {
            return bean;
        }

        BeanDefinition beanDefinition = getBeanDefinition(name);
        return createBean(name, beanDefinition);
    }










}
